﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Uurrooster_opdracht
{
    public partial class FormVakken : Form
    {

        //-------------------------------------------attributen----------------------------------------
        DataClasses1DataContext DB;
        static List<tblVak> LijstVakken;

        //-------------------------------------------initialisatie-------------------------------------
        public FormVakken()
        {
            InitializeComponent();
            DB = new DataClasses1DataContext();
            LijstVakken = DB.tblVaks.ToList();

        }

        private void FormVakken_Load(object sender, EventArgs e)
        {
            resetLijst();
            buttonAdd.Enabled = false;
            buttonFirst_Click(null, null);
        }


        //------------------------------------------handlers voor buttons-----------------------------

        //                                    ***********************************
        //                                    *                                 *
        //                                    *     N A V I G A T I E           *
        //                                    *     K N O P P E N               *
        //                                    *                                 * 
        //                                    ***********************************

        private void buttonFirst_Click(object sender, EventArgs e)
        {
            //update andere buttons!
            buttonNext.Enabled = true;
            buttonPrevious.Enabled = false;
            buttonAdd.Enabled = false;
            buttonClear.Enabled = true;
            buttonEdit.Enabled = true;
            buttonDelete.Enabled = true;

            resetLijst();
            long firstID = LijstVakken.First().vakID;
            displayVak(firstID);
        }

        private void buttonNext_Click(object sender, EventArgs e)
        {
            //update andere buttons!
            buttonPrevious.Enabled = true;
            buttonClear.Enabled = true;
            buttonEdit.Enabled = true;
            buttonAdd.Enabled = false;
            buttonDelete.Enabled = true;

            resetLijst();


            long huidigeVakID = Convert.ToInt64(textID.Text);


            //startwaarde om positie van huidige student in lijst te zoeken
            int index = -1;

            //index laten oplopen zolang de juiste student niet gevonden is
            //totdat einde lijst bereikt is
            do
            {
                index++; //opmerking : feitelijk starten we bij item nr 0
            }
            while ((LijstVakken[index].vakID != huidigeVakID) &&
                   (index < LijstVakken.Count()));

            //nu wordt overgeschakeld van de huidige student op de volgende student
            index++;

            //de loop wordt verlaten indien alle elementen uit de lijst zijn doorlopen
            //in dat geval = index gelijk aan Count()
            //in dat geval -> doe niets
            if (index == LijstVakken.Count())
            {
                displayVak(LijstVakken.Last().vakID);
                String addTekst = "einde bereikt";
                textInfo.Text = addTekst;

                //nog toe te voegen : DISABLE BUTTON NEXT !!! 
                buttonNext.Enabled = false;
            }



            //de loop wordt ook verlaten in dat geval is de index gelijk aan de huidig af te beelden 
            //student
            if (index < LijstVakken.Count())
            {
                this.displayVak(LijstVakken[index].vakID);
            }

        }

        private void buttonPrevious_Click(object sender, EventArgs e)
        {
            //update andere buttons!
            buttonNext.Enabled = true;
            buttonClear.Enabled = true;
            buttonEdit.Enabled = true;
            buttonAdd.Enabled = false;
            buttonDelete.Enabled = true;

            resetLijst();

            long huidigeVakID = Convert.ToInt64(textID.Text);

            //startwaarde om positie van huidige student in lijst te zoeken
            int index = -1;

            //index laten oplopen zolang de juiste student niet gevonden is
            //totdat einde lijst bereikt is
            do
            {
                index++; //opmerking : feitelijk starten we bij item nr 0
            }
            while ((LijstVakken[index].vakID != huidigeVakID) &&
                   (index < LijstVakken.Count()));

            //ofwel hebben we de huidige student gevonden en is index = de positie van
            //de huidige student in de lijst, ofwel hebben we de huidige student niet 
            //gevonden en is index = Count van de lijst

            //de loop wordt verlaten indien alle elementen uit de lijst zijn doorlopen
            //in dat geval = index gelijk aan Count()
            //in dat geval -> doe niets
            if (index == LijstVakken.Count())
            {
                String addTekst = "error bij zoeken Vak!";
                textInfo.Text = addTekst;
            }


            //de loop wordt ook verlaten in dat geval is de index gelijk aan de huidig af te beelden 
            //student...
            //overschakelen naar voorgaande student !
            index--;
            if (index >= 0)
            {
                this.displayVak(LijstVakken[index].vakID);
            }
            else  //index kleiner dan nul is niet zinvol!
            {
                displayVak(LijstVakken.First().vakID);
                String addTekst = "begin bereikt";
                textInfo.Text = addTekst;

                //nog toe te voegen : DISABLE BUTTON PREVIOUS !!! 
                buttonPrevious.Enabled = false;
            }

        }

        private void buttonLast_Click(object sender, EventArgs e)
        {
            //update andere buttons!
            buttonNext.Enabled = false;
            buttonPrevious.Enabled = true;
            buttonClear.Enabled = true;
            buttonEdit.Enabled = true;
            buttonAdd.Enabled = false;
            buttonDelete.Enabled = true;

            resetLijst();
            long lastID = LijstVakken.Last().vakID;
            displayVak(lastID);

        }


        //                                    ***********************************
        //                                    *                                 *
        //                                    *     M A N I P U L A T I E       *
        //                                    *     K N O P P E N               *
        //                                    *                                 * 
        //                                    ***********************************

        
        private void buttonAdd_Click(object sender, EventArgs e)
        {
             //verhinderen van lege input
            if ( textVnDocent.Text == "" )
            {
                textInfo.Text = "Geen Lege Input aub!";
            }
            else
            {
                tblVak nieuwVak = new tblVak();
                String nieuweVakNaam = textVnDocent.Text;

                // ? bestaat deze student reeds 
                var query =  (from tblVak in DB.tblVaks
                                        where  tblVak.vakNaam == nieuweVakNaam
                                        select tblVak.vakID).ToList();
                if (query.Count() != 0)
                {
                    textInfo.Text = "Dit vak bestaat al!";
                }
                else
                {
                    //toevoegen is toegelaten!
                    try
                    {
                        nieuwVak.vakNaam = nieuweVakNaam;
                        DB.tblVaks.InsertOnSubmit(nieuwVak);
                        DB.SubmitChanges();
                        displayVak(nieuwVak.vakID);
                        //** update situatie van buttons **
                        buttonAdd.Enabled = false;
                        buttonClear.Enabled = true;
                        buttonEdit.Enabled = true;
                        buttonDelete.Enabled = true;
                        buttonFirst.Enabled = true;
                        buttonPrevious.Enabled = true;
                        buttonNext.Enabled = false;
                        buttonLast.Enabled = true;
                        resetLijst();//update totaal vakken
                        textInfo.Text = "1 Vak toegevoegd";
                    }
                    catch
                    {
                        MessageBox.Show("Fout opgetreden bij toevoegen Vak...", "Error!");
                    }
                }
            }
        }

        private void buttonClear_Click(object sender, EventArgs e)
        {
            resetLijst(); //vrijmaken tekstveld en updaten totaal
            textVnDocent.Text = "";
            textID.Text = "";
            buttonAdd.Enabled = true;
            buttonEdit.Enabled = false;
            buttonClear.Enabled = false;
            buttonDelete.Enabled = false;
            buttonNext.Enabled = false;
            buttonPrevious.Enabled = false;
        }


        // Button EDIT is geupdate zodat elk leeg veld NIET aanvaard wordt als input!
        private void buttonEdit_Click(object sender, EventArgs e)
        {
                if (textVnDocent.Text == "" )
                {
                    textInfo.Text = "Geen Lege Input aub!";
                }
                else
                {
                    
                    //copieer de info uit de tekstvelden
                    long huidigeID = Convert.ToInt64(textID.Text);
                    tblVak gekozen = (from tblVak in DB.tblVaks
                                          where tblVak.vakID == huidigeID
                                          select tblVak).First();
                    String nieuweTekst = getNaamVak();

                    // ? bestaat deze student reeds 
                    var query =  (from tblVak in DB.tblVaks
                                        where  tblVak.vakNaam == nieuweTekst
                                        select tblVak.vakID).ToList();
                    if (query.Count() != 0)
                    {
                        textInfo.Text = "Dit vak bestaat al!";
                    }
                    else
                    {
                        //wijzigen is toegelaten
                        try
                        {
                            gekozen.vakNaam = nieuweTekst;
                            DB.SubmitChanges();
                            displayVak(gekozen.vakID);
                            //** update situatie van buttons **
                            buttonAdd.Enabled = false;
                            buttonClear.Enabled = true;
                            buttonEdit.Enabled = true;
                            buttonDelete.Enabled = true;
                            buttonFirst.Enabled = true;
                            buttonPrevious.Enabled = true;
                            buttonNext.Enabled = true;
                            buttonLast.Enabled = true;
                            resetLijst();//update totaal studenten
                            textInfo.Text = "1 Vak gewijzigd";
                        }
                        catch
                        {
                            MessageBox.Show("Fout opgetreden bij editen Vak...", "Error!");
                        }
                    }
                }
        }

        private void buttonDelete_Click(object sender, EventArgs e)
        {
            try
            {
                long huidigeID = Convert.ToInt64(textID.Text);
                tblVak gekozen = (from tblVak in DB.tblVaks
                                      where tblVak.vakID == huidigeID
                                      select tblVak).First();
                DB.tblVaks.DeleteOnSubmit(gekozen);
                DB.SubmitChanges();
                buttonFirst_Click(null, null);
                textInfo.Text = "1 Vak verwijderd";
            }
            catch
            {
                MessageBox.Show("Fout opgetreden bij verwijderen Vak...", "Error!");
            }
        }

        

        //                                    ***********************************
        //                                    *                                 *
        //                                    *     S E A R C H                 *
        //                                    *     K N O P P E N               *
        //                                    *                                 * 
        //                                    ***********************************
        
        private void buttonSearch_Click(object sender, EventArgs e)
        {
            resetLijst();
            String gezocht = textInputSearch.Text;
            if (LijstVakken.Count > 0)
            {
                IQueryable query = (from tblVak in DB.tblVaks
                                    where tblVak.vakNaam.Contains(gezocht)
                                    select tblVak.vakNaam.Trim() + " " + "/" + tblVak.vakID);
                comboSearchResults.DataSource = query;
                int match = comboSearchResults.Items.Count;
                textMatches.Text = "matches: " + Convert.ToString(match);
            }
            else
            {
                textInfo.Text = "Geen gegevens om te zoeken!";
            }
        }

        private void butCopy_Click(object sender, EventArgs e)
        {
            //nu alleen nog de overzetten van Combobox naar tekstvelden voor input!
            int plaats = comboSearchResults.SelectedItem.ToString().IndexOf("/");
            string id = (comboSearchResults.SelectedItem.ToString().Remove(0, plaats + 1));
            displayVak(Convert.ToInt64(id));                        
        }


        ////*************************************************************andere methoden

        //RESET LIJST
        private void resetLijst()
        {
            LijstVakken = DB.tblVaks.ToList();
            textTotaal.Text = "aantal vakken: " + Convert.ToString(LijstVakken.Count());
            textInfo.Text = "";
        }


        //DISPLAY INFO DOCENT
        private void displayVak(long x)
        {
            resetLijst();
            try
            {
                tblVak gekozen = (from tblVak in DB.tblVaks
                                      where tblVak.vakID == x
                                      select tblVak).First();
                textVnDocent.Text = gekozen.vakNaam;
                textID.Text = Convert.ToString(gekozen.vakID);
            }
            catch
            {
                MessageBox.Show("Fout opgetreden bij methode dipslayVak...", "Error!");
            }
        }


        //naam Docent op de juiste lengte
        private String getNaamVak()
        {
            return textVnDocent.Text.PadRight(20).Substring(0, 20);
        }







    }
}
